package services

import (
	"douhu_backend/internal/dao"
	"douhu_backend/internal/services/auth"
	"douhu_backend/internal/services/common"
	"douhu_backend/internal/services/douyin"
	"sync"
)

// Manager 服务管理器，统一管理所有 Service 实例
type Manager struct {
	daoManager *dao.Manager

	// 基础服务
	JWT    common.JWTService
	SMS    common.SMSService
	Upload *common.UploadService
	CORS   *common.CORSService

	// 业务服务
	Auth   *auth.Service
	Douyin *douyin.Service
}

var (
	managerInstance *Manager
	managerOnce     sync.Once
)

// NewManager 创建服务管理器
func NewManager(daoManager *dao.Manager) (*Manager, error) {
	// 1. 初始化基础服务
	jwtService, err := common.NewJWTService()
	if err != nil {
		return nil, err
	}

	smsService, err := common.NewTencentSMSService()
	if err != nil {
		return nil, err
	}

	uploadService := common.NewUploadService()
	corsService := common.NewCORSServiceFromConfig()

	// 2. 创建服务管理器实例（此时业务服务为 nil）
	manager := &Manager{
		daoManager: daoManager,
		JWT:        jwtService,
		SMS:        smsService,
		Upload:     uploadService,
		CORS:       corsService,
	}

	// 3. 初始化业务服务（传入管理器引用，实现服务间调用）
	manager.Auth = auth.NewService(manager)
	manager.Douyin = douyin.NewService(manager)

	return manager, nil
}

// InitManager 初始化全局服务管理器（单例模式）
func InitManager(daoManager *dao.Manager) (*Manager, error) {
	var err error
	managerOnce.Do(func() {
		managerInstance, err = NewManager(daoManager)
	})
	return managerInstance, err
}

// GetManager 获取全局服务管理器实例
func GetManager() *Manager {
	if managerInstance == nil {
		panic("service manager not initialized, please call InitManager() first")
	}
	return managerInstance
}

// GetDAOManager 获取 DAO 管理器
func (m *Manager) GetDAOManager() *dao.Manager {
	return m.daoManager
}

// GetJWT 获取 JWT 服务
func (m *Manager) GetJWT() common.JWTService {
	return m.JWT
}

// GetSMS 获取短信服务
func (m *Manager) GetSMS() common.SMSService {
	return m.SMS
}

// GetUpload 获取上传服务
func (m *Manager) GetUpload() *common.UploadService {
	return m.Upload
}

// GetCORS 获取 CORS 服务
func (m *Manager) GetCORS() *common.CORSService {
	return m.CORS
}

// GetAuth 获取认证服务
func (m *Manager) GetAuth() *auth.Service {
	return m.Auth
}

// GetDouyin 获取抖音服务
func (m *Manager) GetDouyin() *douyin.Service {
	return m.Douyin
}

// IsInitialized 检查服务管理器是否已初始化
func (m *Manager) IsInitialized() bool {
	return managerInstance != nil
}
